package com.appspot.dojompdft.server;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import com.appspot.dojompdft.client.EventoServico;
import com.appspot.dojompdft.shared.Evento;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class EventoServicoImpl extends RemoteServiceServlet implements EventoServico {

	@Override
	public Evento obterPelaChave(String chave) {
		EntityManager em = EMF.get().createEntityManager();
		EntityTransaction tx = em.getTransaction();
		tx.begin();

		Evento evento = null;

		if (chave != null)
			evento = em.find(Evento.class, chave);

		tx.commit();
		em.close();

		return evento;
	}

	@SuppressWarnings("unchecked")
	public Collection<Evento> listarTodos() {
		EntityManager em = EMF.get().createEntityManager();
		EntityTransaction tx = em.getTransaction();

		List<Evento> lista = null;
		List<Evento> retorno = new ArrayList<Evento>();

		try {
			tx.begin();

			lista = (List<Evento>) em.createQuery("SELECT FROM Evento").getResultList();

			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (tx.isActive())
				tx.rollback();
		}

		em.close();
		
		for(Evento e : lista) {
			Evento e1 = new Evento();
			e1.setId(e.getId());
			e1.setDescricao(e.getDescricao());
			retorno.add(e1);
		}
		
		return retorno;
	}

	@Override
	public Evento salvar(Evento evento) {
		EntityManager em = EMF.get().createEntityManager();
		EntityTransaction tx = em.getTransaction();

		try {
			tx.begin();
			if (evento.getId() == null)
				em.persist(evento);
			else
				em.merge(evento);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (tx.isActive())
				tx.rollback();
		}

		return evento;
	}

	@Override
	public Evento excluir(String chave) {
		EntityManager em = EMF.get().createEntityManager();
		EntityTransaction tx = em.getTransaction();
		
		Evento evento = em.find(Evento.class, chave);
		
		try {
			tx.begin();
			em.remove(evento);
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (tx.isActive())
				tx.rollback();
		}
		
		return null;
	}
}
